﻿using TouchSocket.Core;
using TouchSocket.Dmtp;
using TouchSocket.Dmtp.FileTransfer;
using TouchSocket.Sockets;

var client = new TcpDmtpClient();
await client.SetupAsync(new TouchSocketConfig()
    .SetRemoteIPHost("127.0.0.1:7789")
    .ConfigurePlugins(a => {
        a.UseDmtpFileTransfer();//必须添加文件传输插件
    }).ConfigureContainer(a =>
    {
        a.AddConsoleLogger();
    })
    .SetDmtpOption(new DmtpOption()
    {
        VerifyToken = "Dmtp"
    }));
await client.ConnectAsync();

var filePath = @"C:\Users\Administrator\Desktop\easy-lp\Test\linux.iso";
var saveFilePath = @"C:\Users\Administrator\Desktop\easy-lp\Test\linux11.iso";

var metadata = new Metadata();//传递到服务器的元数据
metadata.Add("1", "1");
metadata.Add("2", "2");

var fileOperator = new FileOperator()//实例化本次传输的控制器，用于获取传输进度、速度、状态等。
{
    SavePath = saveFilePath,//服务器本地保存路径
    ResourcePath = filePath,//客户端本地即将上传文件的资源路径
    Metadata = metadata,//传递到服务器的元数据
    Timeout = TimeSpan.FromSeconds(60),//传输超时时长
    TryCount = 10,//当遇到失败时，尝试次数
    FileSectionSize = 1024 * 512//分包大小，当网络较差时，应该适当减小该值
};

fileOperator.MaxSpeed = 1024 * 1024 *10;//设置最大限速为10Mb。

//此处的作用相当于Timer，定时每秒输出当前的传输进度和速度。
Console.WriteLine("连接服务器成功,传输中..");

int cursorLeft = Console.CursorLeft;  // 记录数字的起始位置

var loopAction = LoopAction.CreateLoopAction(-1, 500, (loop) =>
{
    if (fileOperator.Result.ResultCode != ResultCode.Default)
    {
        loop.Dispose();
    }
    var p = Math.Round(fileOperator.Progress * 100, 0);

    Console.SetCursorPosition(cursorLeft, Console.CursorTop);  // 回到数字的位置
    Console.Write($"{p}%");  // 只更新数字部分
});

_ = loopAction.RunAsync();

//此方法会阻塞，直到传输结束，也可以使用PushFileAsync
IResult result = client.GetDmtpFileTransferActor().PushFile(fileOperator);

await Task.Delay(500);
Console.WriteLine();
Console.Write(result.IsSuccess);

Console.ReadKey();